# -*- coding: utf-8 -*-
# author: sixmillions
# date: 2022/3/24

# 位运算符，都是操作二进制的，就是按照二进制操作，其他操作数也会被转为二进制


# & 按位与
# 规则：
# 0 & 0 --> 0
# 0 & 1 --> 0
# 1 & 0 --> 0
# 1 & 1 --> 1
print(1, bin(3))  # 0b11
print(2, bin(6))  # 0b110
print(3, 3 & 6)  # 左边补零至相同位数（32），011和110按位与，结果010，转化为十进制就是2

# | 按位或
# 0 & 0 --> 0
# 0 & 1 --> 1
# 1 & 0 --> 1
# 1 & 1 --> 1
print(4, bin(3))  # 0b11
print(5, bin(6))  # 0b110
print(6, 3 | 6)  # 011和110按位或，结果111，转化为十进制就是7
print(7, int(0b111))  # 7

# ^ 按位异或，相同为零，不同为1
# 0 & 0 --> 0
# 0 & 1 --> 1
# 1 & 0 --> 1
# 1 & 1 --> 0
print(8, bin(3))  # 0b11
print(9, bin(6))  # 0b110
print(10, 3 ^ 6)  # 011和110按位或，结果101，转化为十进制就是5
print(11, int(0b101))  # 5

# ~ 按位取反
print(12, bin(7))  # 0b111
print(13, ~7)  # -8 ，设计到计算机位数和复数用补码表示等问题，有兴趣可以看看

# << 左移
print(14, 3 << 2)  # 12  011，左移2位，1100
print(15, int(0b1100))

# >> 右移
print(16, bin(16))  # 0b10000
print(17, 16 >> 2)  # 4  10000右移2位，100
print(18, int(0b100))  # 4
